#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug>
#include <QBuffer>
#include <QFileDialog>

QSharedMemory sharedMemory;

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    connect(ui->btnwrite,SIGNAL(clicked()),this,SLOT(loadFromFile()));
    sharedMemory.setKey("QSharedMemoryExample"); //为实例对象指定关键字(给共享内存命名)
}

//进程A-写 分为下面几步：
//检测该进程是否连接到共享内存段，如果连接，则将该进程与共享内存段分离。
//从系统足够大的内存中得到一个新的共享内存段。
//锁定该共享内存段，以阻止第二个对话框进程访问，将缓冲区中的图片复制进共享内存段。
//将共享内存段解锁，然后第二个对话框进程就可以访问了。

void Dialog::loadFromFile()
{
    if(sharedMemory.isAttached())
    {
        // 将该进程与共享内存段分离
        if (!sharedMemory.detach())
            qDebug() << "Unable to detach from shared memory.";
    }

    QString fileName = QFileDialog::getOpenFileName(0, QString(), QString(),
                                        tr("Images (*.png *.xpm *.jpg)"));
    QImage image;
    if (!image.load(fileName))
    {
        qDebug() << "Selected file is not an image, please select another.";
        return;
    }

    // 将数据加载到共享内存中
    QBuffer buffer;
    buffer.open(QBuffer::ReadWrite);
    QDataStream out(&buffer);
    out << image;
    int size = buffer.size();

    // 创建共享内存段
    if (!sharedMemory.create(size))
    {
        qDebug() << sharedMemory.errorString() << "\n Unable to create shared memory segment.";
        return;
    }
    sharedMemory.lock();
    char *to = (char*)sharedMemory.data();
    const char *from = buffer.data().data();
    memcpy(to, from, qMin(sharedMemory.size(), size));
    sharedMemory.unlock();
}

Dialog::~Dialog()
{
    delete ui;
}


void Dialog::on_btnwrite_clicked()
{
    loadFromFile();
}
